home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-03-26 | 49.1 KB | 1,864 lines |
- ---- Cut Here and feed the following to sh ----
- #!/bin/sh
- # This is part 02 of a multipart archive
- # ============= GWDownload.cc ==============
- if test -f 'GWDownload.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWDownload.cc (File already exists)'
- else
- echo 'x - extracting GWDownload.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWDownload.cc' &&
- //
- // GWDownload.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWDownload class
- //
- #include "GWDownload.h"
- #include "xvgopher.h"
- #include "cursor.h"
- #include <string.h>
- #include <fcntl.h>
- #include <unistd.h>
- X
- #define KEY_TEXT_ITEM 20000
- #define KEY_SAVE 20001
- #define KEY_CANCEL 20002
- #define KEY_OTHER 20003
- X
- X
- //***************************************************************************
- // GWDownload::GWDownload(Frame par, int download_type)
- //
- GWDownload::GWDownload(Frame par, int download_type)
- {
- X parent = par;
- X type = download_type;
- X button = NULL;
- X button_command = NULL;
- }
- X
- X
- //***************************************************************************
- // GWDownload::GWDownload(Frame par, int download_type, char *btn, char *btncmd)
- //
- GWDownload::GWDownload(Frame par, int download_type, char *btn, char *btncmd)
- {
- X parent = par;
- X type = download_type;
- X button = btn;
- X button_command = btncmd;
- }
- X
- X
- //***************************************************************************
- // void GWDownload::bin_save_notify(Panel_item item, Event *)
- // PURPOSE:
- // We get here when the user wants to copy our temporary copy into a more
- // permanent file.
- //
- void GWDownload::bin_save_notify(Panel_item item, Event *)
- {
- X GWDownload *gwindow = (GWDownload *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X Gopher *gopher = gwindow->gopher;
- X Panel_item txt = (Panel_item) xv_get(item, XV_KEY_DATA, KEY_TEXT_ITEM);
- X int fd = ::open((char *) xv_get(txt, PANEL_VALUE), O_CREAT | O_WRONLY, 0644);
- X if (fd < 0)
- X {
- X gwindow->status("Unable to create file");
- X return;
- X }
- X
- X //
- X // Ok, we now have a new file we can write to. We will just open the
- X // temporary file and copy its contents block by block to the new file.
- X //
- X gwindow->status("Saving...");
- X int old = ::open(gopher->filename, O_RDONLY);
- X char buffer[10240];
- X int n;
- X while ((n = ::read(old, buffer, 10240)) > 0)
- X {
- X ::write(fd, buffer, n);
- X }
- X ::close(fd);
- X ::close(old);
- X gwindow->status("File saved");
- }
- X
- X
- //***************************************************************************
- // void GWDownload::bin_cancel_notify(Panel_item, Event *)
- //
- void GWDownload::bin_cancel_notify(Panel_item item , Event *)
- {
- X GWDownload *gwindow = (GWDownload *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X delete gwindow;
- X Frame frame = (Frame) xv_get(item, XV_KEY_DATA, KEY_FRAME);
- X xv_destroy_safe(frame);
- }
- X
- X
- //***************************************************************************
- // void GWDownload::bin_other_notify(Panel_item, Event *)
- //
- void GWDownload::bin_other_notify(Panel_item item , Event *)
- {
- X GWDownload *gwindow = (GWDownload *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X Gopher *gopher = gwindow->gopher;
- X Panel_item txt = (Panel_item) xv_get(item, XV_KEY_DATA, KEY_TEXT_ITEM);
- X
- X char command[1000];
- X sprintf(command, "%s %s &", gwindow->button_command, gopher->filename);
- X system(command);
- X
- X sprintf(command, "Started %s on %s", gwindow->button, gopher->filename);
- X gwindow->status(command);
- }
- X
- X
- //***************************************************************************
- // Panel_setting GWDownload::bin_text_notify(Panel_item item, Event *event)
- //
- Panel_setting GWDownload::bin_text_notify(Panel_item item, Event *event)
- {
- X bin_save_notify(item, event);
- X return PANEL_NONE;
- }
- X
- X
- //***************************************************************************
- // int GWDownload::open(Response *resp)
- // PURPOSE:
- // This will create a prompt window
- //
- int GWDownload::open(Response *resp)
- {
- X info = resp;
- X compute_location(407, 107);
- X frame = (Frame) xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, 407,
- X XV_HEIGHT, 107,
- X FRAME_LABEL, "Saving a file",
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
- X FRAME_SHOW_RESIZE_CORNER, FALSE,
- X XV_SHOW, TRUE,
- X FRAME_SHOW_FOOTER, TRUE,
- X FRAME_RIGHT_FOOTER, info->get_server(),
- X FRAME_DONE_PROC, done_proc,
- X FRAME_ACCELERATOR, 'q', quit_proc, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X
- X //
- X // Create the text field and put a usable default name in it.
- X //
- X char *p = strrchr(info->get_command(), '/');
- X if (!p)
- X p = info->get_command();
- X else
- X p++;
- X char *str = strdup(p);
- X for (p = str; *p; p++)
- X if (*p <= ' ' || *p > 126)
- X *p = '_';
- X Panel_item txt = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 16,
- X XV_Y, 28,
- X PANEL_LABEL_STRING, "Save file as:",
- X PANEL_VALUE_DISPLAY_LENGTH, 35,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_VALUE, str,
- X PANEL_NOTIFY_PROC, bin_text_notify,
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X XV_KEY_DATA, KEY_GOPHER, gopher,
- X PANEL_INACTIVE, TRUE,
- X NULL);
- X delete str;
- X xv_set(txt,
- X XV_KEY_DATA, KEY_TEXT_ITEM, txt,
- X NULL);
- X
- X //
- X // Create the buttons. There may be two or three buttons. We need to spread them
- X // evenly to make it look better.
- X //
- X int ob_x, sb_x, cb_x;
- X if (button)
- X {
- X //
- X // There will be three buttons
- X //
- X ob_x = 107;
- X sb_x = 175;
- X cb_x = 241;
- X }
- X else
- X {
- X //
- X // Only two buttons
- X //
- X sb_x = 141;
- X cb_x = 207;
- X }
- X Panel_item sb = (Panel_item) xv_create(panel, PANEL_BUTTON,
- X XV_X, sb_x,
- X XV_Y, 64,
- X PANEL_LABEL_STRING, "Save",
- X PANEL_NOTIFY_PROC, bin_save_notify,
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X XV_KEY_DATA, KEY_GOPHER, gopher,
- X XV_KEY_DATA, KEY_TEXT_ITEM, txt,
- X PANEL_INACTIVE, TRUE,
- X NULL);
- X Panel_item cb = (Panel_item) xv_create(panel, PANEL_BUTTON,
- X XV_X, cb_x,
- X XV_Y, 64,
- X PANEL_LABEL_STRING, "Cancel",
- X PANEL_NOTIFY_PROC, bin_cancel_notify,
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X XV_KEY_DATA, KEY_TEXT_ITEM, txt,
- X PANEL_INACTIVE, TRUE,
- X NULL);
- X Panel_item ob = NULL;
- X if (button)
- X {
- X ob = (Panel_item) xv_create(panel, PANEL_BUTTON,
- X XV_X, ob_x,
- X XV_Y, 64,
- X PANEL_LABEL_STRING, button,
- X PANEL_NOTIFY_PROC, bin_other_notify,
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X XV_KEY_DATA, KEY_TEXT_ITEM, txt,
- X PANEL_INACTIVE, TRUE,
- X NULL);
- X }
- X
- X //
- X // Associate the panel items with the frame so we can get at them later on
- X //
- X xv_set(frame,
- X XV_KEY_DATA, KEY_SAVE, sb,
- X XV_KEY_DATA, KEY_CANCEL, cb,
- X XV_KEY_DATA, KEY_OTHER, ob,
- X XV_KEY_DATA, KEY_TEXT_ITEM, txt,
- X NULL);
- X //
- X // Now we need to build the connection and get information from it
- X //
- X frame_busy(frame);
- X status("Building connection...");
- X gopher = new Gopher(this);
- X if (gopher->open(info->get_server(), info->get_port()) == NOTOK) // Connection
- X return NOTOK;
- X gopher->read(info->get_type(), info->get_command()); // Get info
- X
- X return OK;
- }
- X
- X
- //***************************************************************************
- // void GWDownload::display()
- // PURPOSE:
- // This is called when the receive of a file has been completed.
- //
- void GWDownload::display()
- {
- X //
- X // Now make the items in the window active so that the file can be saved
- X //
- X frame_unbusy(frame);
- X Panel_item b = (Panel_item) xv_get(frame, XV_KEY_DATA, KEY_SAVE);
- X xv_set(b, PANEL_INACTIVE, FALSE, NULL);
- X b = (Panel_item) xv_get(frame, XV_KEY_DATA, KEY_CANCEL);
- X xv_set(b, PANEL_INACTIVE, FALSE, NULL);
- X b = (Panel_item) xv_get(frame, XV_KEY_DATA, KEY_TEXT_ITEM);
- X xv_set(b, PANEL_INACTIVE, FALSE, NULL);
- X b = (Panel_item) xv_get(frame, XV_KEY_DATA, KEY_OTHER);
- X if (b)
- X xv_set(b, PANEL_INACTIVE, FALSE, NULL);
- }
- X
- X
- SHAR_EOF
- chmod 0644 GWDownload.cc ||
- echo 'restore of GWDownload.cc failed'
- Wc_c="`wc -c < 'GWDownload.cc'`"
- test 7644 -eq "$Wc_c" ||
- echo 'GWDownload.cc: original size 7644, current size' "$Wc_c"
- fi
- # ============= GWFile.cc ==============
- if test -f 'GWFile.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWFile.cc (File already exists)'
- else
- echo 'x - extracting GWFile.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWFile.cc' &&
- //
- // GWFile.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWFile class
- //
- #include "GWFile.h"
- #include "xvgopher.h"
- #include "cursor.h"
- #include <xview/textsw.h>
- X
- #define KEY_TEXT_ITEM 20000
- #define KEY_TYPE 20001
- #define KEY_TEXT 20002
- #define TYPE_SAVE 1
- #define TYPE_MAIL 2
- X
- X
- //***************************************************************************
- // GWFile::GWFile(Frame par)
- //
- GWFile::GWFile(Frame par)
- {
- X parent = par;
- }
- X
- X
- //***************************************************************************
- // static void menu_proc(Menu menu, Menu_item menu_item)
- //
- static void menu_proc(Menu menu, Menu_item menu_item)
- {
- X char *str = (char *) xv_get(menu_item, MENU_STRING);
- X Panel_item txt = (Panel_item) xv_get(menu, XV_KEY_DATA, KEY_TEXT_ITEM);
- X Textsw t = (Textsw) xv_get(menu, XV_KEY_DATA, KEY_TEXT);
- X char command[200];
- X
- X if (strcmp(str, "Save...") == 0)
- X {
- X xv_set(txt,
- X PANEL_LABEL_STRING, "Save as:",
- X XV_KEY_DATA, KEY_TYPE, TYPE_SAVE,
- X XV_SHOW, TRUE,
- X NULL);
- X }
- X else if (strcmp(str, "Print") == 0)
- X {
- X //
- X // First save the file
- X //
- X textsw_save(t, 0, 0);
- X char name[200];
- X name[0] = '\0';
- X textsw_append_file_name(t, name);
- X
- X //
- X // This needs to use a user definable print method!!!
- X //
- X sprintf(command, "%s %s &", preferences.get_print_filter(), name);
- X system(command);
- X }
- X else if (strcmp(str, "Mail...") == 0)
- X {
- X xv_set(txt,
- X PANEL_LABEL_STRING, "Mail to:",
- X XV_KEY_DATA, KEY_TYPE, TYPE_MAIL,
- X XV_SHOW, TRUE,
- X NULL);
- X }
- }
- X
- X
- //***************************************************************************
- // static Panel_setting text_notify(Panel_item item, Event *event)
- //
- static Panel_setting text_notify(Panel_item item, Event *event)
- {
- X event = event;
- X char *string = (char *) xv_get(item, PANEL_VALUE);
- X Textsw t = (Textsw) xv_get(item, XV_KEY_DATA, KEY_TEXT);
- X GWindow *gwindow = (GWindow *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X
- X switch (xv_get(item, XV_KEY_DATA, KEY_TYPE))
- X {
- X case TYPE_SAVE:
- X gwindow->status("Saving...");
- X if (textsw_store_file(t, string, 0, 0) != 0)
- X {
- X //
- X // Some problem occured... Notify the user
- X //
- X gwindow->status("Unable to save!");
- X }
- X else
- X gwindow->status("File saved");
- X break;
- X case TYPE_MAIL:
- X {
- X textsw_save(t, 0, 0);
- X char name[200];
- X name[0] = '\0';
- X
- X Frame frame = (Frame) xv_get(item, XV_KEY_DATA, KEY_FRAME);
- X char *subject = (char *) xv_get(frame, FRAME_LABEL);
- X
- X textsw_append_file_name(t, name);
- X gwindow->status("Mailing...");
- X char command[200];
- X sprintf(command, "%s -s '%s' %s < %s", preferences.get_mail_filter(), subject, string, name);
- X system(command);
- X gwindow->status("File mailed");
- X break;
- X }
- X }
- X return PANEL_NONE;
- }
- X
- X
- //***************************************************************************
- // int GWFile::open(Response *resp)
- // PURPOSE:
- // This will create a window in which a file will be displayed. We will create
- // a command frame with a textsw at the bottom. The top will be a panel with
- // a menu and a hidden text field.
- //
- int GWFile::open(Response *resp)
- {
- X info = resp;
- X compute_location(600, 500);
- X frame = (Frame) xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, 600,
- X XV_HEIGHT, 500,
- X FRAME_LABEL, info->get_title(),
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
- X FRAME_SHOW_RESIZE_CORNER, TRUE,
- X XV_SHOW, TRUE,
- X FRAME_SHOW_FOOTER, TRUE,
- X FRAME_RIGHT_FOOTER, info->get_server(),
- X FRAME_DONE_PROC, done_proc,
- X FRAME_ACCELERATOR, 'q', quit_proc, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X textsw = (Textsw) xv_create(frame, TEXTSW,
- X XV_X, 0,
- X XV_Y, 29,
- X NULL);
- X
- X //
- X // Child windows have a close button
- X //
- X dir_quit = xv_create(panel, PANEL_BUTTON,
- X XV_X, 488, // It will be relocated anyway...
- X XV_Y, 4,
- X PANEL_LABEL_STRING, "Dismiss",
- X PANEL_NOTIFY_PROC, quit_proc,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X
- X //
- X // Create the menu and button which go in the panel...
- X //
- X Menu menu = (Menu) xv_create(NULL, MENU,
- X MENU_NOTIFY_PROC, menu_proc,
- X MENU_STRINGS, "Save...",
- X "Print",
- X "Mail...",
- X NULL,
- X NULL);
- X xv_create(panel, PANEL_BUTTON,
- X XV_X, 8,
- X XV_Y, 4,
- X PANEL_LABEL_STRING, "Options",
- X PANEL_ITEM_MENU, menu,
- X NULL);
- X
- X //
- X // Create the text item (which will not be visible until one of the options has been
- X // selected)
- X //
- X Panel_item txt = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 128,
- X XV_Y, 8,
- X PANEL_LABEL_STRING, "",
- X PANEL_VALUE_DISPLAY_LENGTH, 40,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_NOTIFY_PROC, text_notify,
- X XV_SHOW, FALSE, // Invisible, initially
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_TEXT, textsw,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X
- X //
- X // Attach the Frame to the menu so that we can see where we were created
- X // when a menu option was selected.
- X //
- X xv_set(menu,
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_TEXT_ITEM, txt,
- X XV_KEY_DATA, KEY_TEXT, textsw,
- X NULL);
- X
- X //
- X // Now we need to build the connection and get information from it
- X //
- X frame_busy(frame);
- X gopher = new Gopher(this);
- X if (gopher->open(info->get_server(), info->get_port()) == NOTOK) // Connection
- X return NOTOK;
- X status("Got connection, Retrieving text...");
- X gopher->read(info->get_type(), info->get_command()); // Get info
- X
- X return OK;
- }
- X
- X
- //***************************************************************************
- // void GWFile::display()
- //
- void GWFile::display()
- {
- X frame_unbusy(frame);
- X xv_set(textsw,
- X TEXTSW_FILE, gopher->filename,
- X NULL);
- }
- X
- X
- SHAR_EOF
- chmod 0664 GWFile.cc ||
- echo 'restore of GWFile.cc failed'
- Wc_c="`wc -c < 'GWFile.cc'`"
- test 5861 -eq "$Wc_c" ||
- echo 'GWFile.cc: original size 5861, current size' "$Wc_c"
- fi
- # ============= GWGopher.cc ==============
- if test -f 'GWGopher.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWGopher.cc (File already exists)'
- else
- echo 'x - extracting GWGopher.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWGopher.cc' &&
- //
- // GWGopher.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWGopher class
- //
- #include "GWGopher.h"
- #include "xvgopher.h"
- #include "cursor.h"
- #include <fcntl.h>
- #include <unistd.h>
- X
- #define KEY_TEXT_ITEM 20000
- X
- X
- //***************************************************************************
- // GWGopher::GWGopher(Frame par)
- //
- GWGopher::GWGopher(Frame par)
- {
- X parent = par;
- }
- X
- X
- //***************************************************************************
- // int GWGopher::open(Response *)
- // PURPOSE:
- // This will create a dialog window to get information about a new gopher server
- //
- int GWGopher::open(Response *)
- {
- X info = NULL;
- X compute_location(407, 107);
- X frame = (Frame) xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, 416,
- X XV_HEIGHT, 128,
- X FRAME_LABEL, "Another Gopher",
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
- X FRAME_SHOW_RESIZE_CORNER, FALSE,
- X XV_SHOW, TRUE,
- X FRAME_SHOW_FOOTER, FALSE,
- X FRAME_DONE_PROC, done_proc,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X
- X //
- X // Create all the panel items
- X //
- X server = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 32,
- X XV_Y, 16,
- X PANEL_LABEL_STRING, "Server name:",
- X PANEL_VALUE_DISPLAY_LENGTH, 30,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X NULL);
- X port = (Panel_item) xv_create(panel, PANEL_NUMERIC_TEXT,
- X XV_X, 43,
- X XV_Y, 41,
- X PANEL_LABEL_STRING, "Server port:",
- X PANEL_VALUE_DISPLAY_LENGTH, 5,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_MAX_VALUE, 30000,
- X PANEL_MIN_VALUE, 1,
- X PANEL_VALUE, 70,
- X NULL);
- X xv_create(panel, PANEL_BUTTON,
- X XV_X, 185,
- X XV_Y, 88,
- X PANEL_LABEL_STRING, "Start",
- X PANEL_NOTIFY_PROC, start_proc,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X return OK;
- }
- X
- X
- //***************************************************************************
- // void GWGopher::start_proc(Frame frame, Event *)
- // PURPOS:
- // This gets called when the user presses 'q' in a window.
- //
- void GWGopher::start_proc(Frame frame, Event *)
- {
- X GWGopher *win = (GWGopher *) xv_get(frame, XV_KEY_DATA, KEY_GWINDOW);
- X
- X int port = (int) xv_get(win->port, PANEL_VALUE);
- X char *server = (char *) xv_get(win->server, PANEL_VALUE);
- X
- X Response *r = new Response("1");
- X r->set_server(server);
- X r->set_port(port);
- X GWindow *main_window = CreateWindow(r, win->frame);
- X if (main_window)
- X main_window->open(r);
- X
- X xv_destroy_safe(frame);
- }
- X
- X
- SHAR_EOF
- chmod 0664 GWGopher.cc ||
- echo 'restore of GWGopher.cc failed'
- Wc_c="`wc -c < 'GWGopher.cc'`"
- test 2602 -eq "$Wc_c" ||
- echo 'GWGopher.cc: original size 2602, current size' "$Wc_c"
- fi
- # ============= GWImage.cc ==============
- if test -f 'GWImage.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWImage.cc (File already exists)'
- else
- echo 'x - extracting GWImage.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWImage.cc' &&
- //
- // GWImage.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWImage class
- //
- #include "GWImage.h"
- #include "xvgopher.h"
- X
- X
- //***************************************************************************
- // GWImage::GWImage(Frame par)
- //
- GWImage::GWImage(Frame par) : GWDownload(par, GWDownload::BINARY, "View", preferences.get_image_filter())
- {
- }
- X
- X
- SHAR_EOF
- chmod 0644 GWImage.cc ||
- echo 'restore of GWImage.cc failed'
- Wc_c="`wc -c < 'GWImage.cc'`"
- test 472 -eq "$Wc_c" ||
- echo 'GWImage.cc: original size 472, current size' "$Wc_c"
- fi
- # ============= GWIndex.cc ==============
- if test -f 'GWIndex.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWIndex.cc (File already exists)'
- else
- echo 'x - extracting GWIndex.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWIndex.cc' &&
- //
- // GWIndex.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWIndex class
- //
- #include "GWIndex.h"
- #include "xvgopher.h"
- #include "cursor.h"
- #include <fcntl.h>
- #include <unistd.h>
- X
- #define KEY_TEXT_ITEM 20000
- X
- X
- //***************************************************************************
- // GWIndex::GWIndex(Frame par)
- //
- GWIndex::GWIndex(Frame par)
- {
- X parent = par;
- }
- X
- X
- //***************************************************************************
- // Panel_setting GWIndex::index_notify(Panel_item item, Event *event)
- // PURPOSE:
- // This is called whenever the user hits return on the text field.
- // When this happens, we will use the string to send to the server
- // and then we can wait for the server to send us the results of the
- // search.
- //
- Panel_setting GWIndex::index_notify(Panel_item item, Event *event)
- {
- X event = event;
- X //
- X // We need to build the connection and get information from it
- X //
- X GWIndex *gwindow = (GWIndex *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X
- X gwindow->status("Performing search...");
- X
- X //
- X // Build a new command string to send to the server. This means that we just add
- X // a tab and the string in our text field to the command.
- X //
- X char new_command[10000];
- X
- X Response *r = new Response("1Results of search");
- X r->set_server(gwindow->info->get_server());
- X r->set_port(gwindow->info->get_port());
- X sprintf(new_command, "%s\t%s",
- X gwindow->info->get_command(),
- X (char *) xv_get(item, PANEL_VALUE));
- X r->set_command(new_command);
- X GWindow *sub = CreateWindow(r, gwindow->frame);
- X
- X gwindow->status("");
- X return PANEL_NONE;
- }
- X
- X
- //***************************************************************************
- // int GWIndex::open(Response *resp)
- // PURPOSE:
- // This will create a prompt window
- //
- int GWIndex::open(Response *resp)
- {
- X info = resp;
- X char frame_title[2000];
- X sprintf(frame_title, "Index search: %s", info->get_title());
- X compute_location(407, 107);
- X frame = (Frame) xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, 407,
- X XV_HEIGHT, 107,
- X FRAME_LABEL, frame_title,
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
- X FRAME_SHOW_RESIZE_CORNER, FALSE,
- X XV_SHOW, TRUE,
- X FRAME_SHOW_FOOTER, TRUE,
- X FRAME_RIGHT_FOOTER, info->get_server(),
- X FRAME_DONE_PROC, done_proc,
- X FRAME_ACCELERATOR, 'q', quit_proc, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X
- X (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 16,
- X XV_Y, 28,
- X PANEL_LABEL_STRING, "Search for:",
- X PANEL_VALUE_DISPLAY_LENGTH, 35,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_NOTIFY_PROC, index_notify,
- X XV_KEY_DATA, KEY_FRAME, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X XV_KEY_DATA, KEY_GOPHER, gopher,
- X NULL);
- X
- X return OK;
- }
- X
- SHAR_EOF
- chmod 0644 GWIndex.cc ||
- echo 'restore of GWIndex.cc failed'
- Wc_c="`wc -c < 'GWIndex.cc'`"
- test 2924 -eq "$Wc_c" ||
- echo 'GWIndex.cc: original size 2924, current size' "$Wc_c"
- fi
- # ============= GWInfo.cc ==============
- if test -f 'GWInfo.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWInfo.cc (File already exists)'
- else
- echo 'x - extracting GWInfo.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWInfo.cc' &&
- //
- // GWInfo.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWInfo class
- //
- #include "GWInfo.h"
- X
- //***************************************************************************
- // GWInfo::GWInfo(Frame par)
- //
- GWInfo::GWInfo(Frame par)
- {
- X parent = par;
- }
- X
- X
- //***************************************************************************
- // int GWInfo::open(Response *resp)
- // Create a little popup which contains information about a response.
- //
- int GWInfo::open(Response *resp)
- {
- X info = resp;
- X char frame_title[2000];
- X sprintf(frame_title, "Info for '%s'", info->get_title());
- X compute_location(390, 180);
- X frame = (Frame) xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, 390,
- X XV_HEIGHT, 180,
- X FRAME_LABEL, frame_title,
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
- X FRAME_SHOW_RESIZE_CORNER, FALSE,
- X XV_SHOW, TRUE,
- X FRAME_DONE_PROC, done_proc,
- X FRAME_ACCELERATOR, 'q', quit_proc, frame,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X
- X //
- X // Create the textsw in the window with the text describing the item.
- X //
- X char buffer[10240];
- X sprintf(buffer, "Name=%s\nType=%c\nPort=%d\nPath=%s\nHost=%s\n",
- X info->get_title(),
- X info->get_type(),
- X info->get_port(),
- X info->get_command(),
- X info->get_server());
- X xv_create(frame, TEXTSW,
- X XV_X, 0,
- X XV_Y, 0,
- X XV_WIDTH, 390,
- X XV_HEIGHT, 180,
- X TEXTSW_CONTENTS, buffer,
- X TEXTSW_IGNORE_LIMIT, TEXTSW_INFINITY,
- X TEXTSW_READ_ONLY, TRUE,
- X NULL);
- X
- X return OK;
- }
- X
- SHAR_EOF
- chmod 0644 GWInfo.cc ||
- echo 'restore of GWInfo.cc failed'
- Wc_c="`wc -c < 'GWInfo.cc'`"
- test 1679 -eq "$Wc_c" ||
- echo 'GWInfo.cc: original size 1679, current size' "$Wc_c"
- fi
- # ============= GWList.cc ==============
- if test -f 'GWList.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWList.cc (File already exists)'
- else
- echo 'x - extracting GWList.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWList.cc' &&
- //
- // GWList.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // This file contains the routines of the GWList class which
- // deal with the opening of windows.
- //
- #include "GWList.h"
- #include "xvgopher.h"
- #include "cursor.h"
- #include "icons.h"
- #include "GWBookmarks.h"
- #include "GWInfo.h"
- #include <stream.h>
- #include <string.h>
- #include <xview/svrimage.h>
- #include <xview/icon.h>
- #include <xview/defaults.h>
- X
- X
- static long double_click_timeout = defaults_get_integer("openwindows.multiclicktimeout", "OpenWindows.MultiClickTimeout", 4) * 100;
- X
- //***************************************************************************
- // GWList::GWList()
- // Do generic initialization. This should be called from any derived constructor.
- //
- GWList::GWList()
- {
- X parent = NULL;
- X dir_list = NULL;
- X dir_quit = NULL;
- X current_selected = -1;
- }
- X
- X
- //***************************************************************************
- // void GWList::frame_event(Xv_Window window, Event *event, Notify_arg)
- // This is where we will take care of window resize events. This is rather
- // messy because XView does not allow for arbitrarily sized scrolling lists.
- // Instead we have to specify the height in rows, not in pixels like the width
- //
- void GWList::frame_event(Xv_Window window, Event *event, Notify_arg)
- {
- X if (event_action(event) == WIN_RESIZE)
- X {
- X //
- X // The window has been resized. We need to resize the list and
- X // relocate the quit button.
- X //
- X GWList *gwindow = (GWList *) xv_get(window, XV_KEY_DATA, KEY_GWINDOW);
- X int width = (int) xv_get(window, XV_WIDTH);
- X int height = (int) xv_get(window, XV_HEIGHT);
- X
- X //
- X // If you can figure out the formula for the number of rows, you
- X // deserve a raise!!!
- X //
- X xv_set(gwindow->dir_list,
- X PANEL_LIST_WIDTH, width - 30,
- X PANEL_LIST_DISPLAY_ROWS, (int) ((height - 61.69) / 18.91) + 1,
- X NULL);
- X
- X //
- X // Ok, we have resized the list. Now relocate the quit or dismiss button if
- X // it is present.
- X //
- X if (gwindow->dir_quit)
- X xv_set(gwindow->dir_quit,
- X XV_X, width - 10 - (gwindow->parent ? 69 : 47),
- X NULL);
- X }
- }
- X
- X
- //***************************************************************************
- // int GWList::open(Response *resp)
- // PURPOSE:
- // This will create a window with a panel at the top and a scrolling list
- // at the bottom. The panel will be empty.
- // The only special thing that is taken care of is that when there is no
- // parent, the window will be a real window, while if there is a parent,
- // the window will be a command window.
- //
- int GWList::open(Response *resp)
- {
- X info = resp;
- X if (!parent)
- X {
- X //
- X // This is the main window
- X //
- X char version[200];
- X sprintf(version, "XvGopher %s. Root Directory", VERSION);
- X frame = (Frame) xv_create(NULL, FRAME,
- X XV_WIDTH, WINDOW_WIDTH,
- X XV_HEIGHT, WINDOW_HEIGHT,
- X FRAME_LABEL, version,
- X NULL);
- X panel = (Panel) xv_create(frame, PANEL,
- X NULL);
- X assign_icon(frame);
- X
- X //
- X // The main window has a quit button
- X //
- X dir_quit = xv_create(panel, PANEL_BUTTON,
- X XV_X, 468, // It will be relocated anyway...
- X XV_Y, 8,
- X PANEL_LABEL_STRING, "Quit",
- X PANEL_NOTIFY_PROC, quit_proc,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X }
- X else
- X {
- X //
- X // We are creating a child window
- X //
- X compute_location(WINDOW_WIDTH, WINDOW_HEIGHT);
- X frame = xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, WINDOW_WIDTH,
- X XV_HEIGHT, WINDOW_HEIGHT,
- X FRAME_LABEL, info->get_title(),
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_IN,
- X FRAME_DONE_PROC, done_proc,
- X FRAME_SHOW_RESIZE_CORNER, TRUE,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X
- X //
- X // Child windows have a close button
- X //
- X dir_quit = xv_create(panel, PANEL_BUTTON,
- X XV_X, 468, // It will be relocated anyway...
- X XV_Y, 8,
- X PANEL_LABEL_STRING, "Dismiss",
- X PANEL_NOTIFY_PROC, quit_proc,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X }
- X
- X //
- X // Now some things which need to be set for both FRAMEs and
- X // FRAME_CMDs
- X //
- X xv_set(frame,
- X FRAME_SHOW_FOOTER, TRUE,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X FRAME_MIN_SIZE, 280, 118,
- X FRAME_MAX_SIZE, 0, 0,
- X WIN_EVENT_PROC, frame_event,
- X WIN_CONSUME_EVENTS,
- X WIN_NO_EVENTS,
- X WIN_RESIZE,
- X NULL,
- X NULL);
- X
- X //
- X // Create the scrolling list. Make it so that 0 or 1 rows can be selected.
- X //
- X dir_list = (Panel_item) xv_create(panel, PANEL_LIST,
- X XV_X, 8,
- X XV_Y, 36,
- X PANEL_LIST_WIDTH, 500,
- X PANEL_LIST_DISPLAY_ROWS, 15,
- X PANEL_NOTIFY_PROC, list_notify,
- X PANEL_READ_ONLY, TRUE,
- X PANEL_CHOOSE_ONE, TRUE,
- X PANEL_CHOOSE_NONE, TRUE,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X
- X return OK;
- }
- X
- X
- //***************************************************************************
- // void GWList::list_notify(Panel_item item, char *, caddr_t cd, Panel_list_op op, Event *event, int row)
- // This is called when the mouse is clicked in the scrolling list.
- // We will determine if this is a double click or not. If it is,
- // we need to create a new window to display the data.
- //
- void GWList::list_notify(Panel_item item, char *, caddr_t cd, Panel_list_op op, Event *event, int row)
- {
- X static long prev_click_time = 0;
- X static int previous_row = -1;
- X long click_time = event->ie_time.tv_sec * 1000 +
- X event->ie_time.tv_usec / 1000;
- X GWList *gwindow = (GWList *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X
- X if (op == 0)
- X {
- X //
- X // The currently selected row was deselected.
- X //
- X gwindow->current_selected = -1;
- X gwindow->row_deselect(row, (Response *) cd);
- X }
- X else
- X {
- X //
- X // A new row was selected.
- X //
- X gwindow->current_selected = row;
- X gwindow->row_select(row, (Response *) cd);
- X }
- X
- X if (row == previous_row)
- X {
- X //
- X // Check if this is a double click
- X //
- X if (click_time - prev_click_time < double_click_timeout)
- X {
- X //
- X // It is. Start a new window.
- X //
- X Response *r = new Response((Response *) cd);
- X GWindow *sub;
- X if (preferences.get_remove_children())
- X sub = CreateWindow(r, gwindow->frame);
- X else
- X sub = CreateWindow(r, !gwindow->parent ? gwindow->frame : gwindow->parent);
- X
- X prev_click_time = 0;
- X previous_row = -1;
- X
- X //
- X // Make sure that the current item is now selected.
- X // It can happen that the user double clicked on an item which was
- X // not yet selected. The first click will selected and the second
- X // click will deselect it. After the second click, we will fall through
- X // to this point, so now we want to select the row again.
- X xv_set(item, PANEL_LIST_SELECT, row, TRUE, NULL);
- X gwindow->row_select(row, (Response *) cd);
- X return;
- X }
- X }
- X previous_row = row;
- X prev_click_time = click_time;
- }
- X
- X
- static unsigned short icon_bits[] = {
- #include "icons/gopher.icon"
- };
- static unsigned short icon_mask_bits[] = {
- #include "icons/gopher.icon.mask"
- };
- X
- //***************************************************************************
- // void GWList::assign_icon(Frame frame)
- //
- void GWList::assign_icon(Frame frame)
- {
- X //
- X // The main frame needs an icon. Give it a good one!
- X //
- X Icon ic;
- X Server_image icon, icon_mask;
- X
- X icon = (Server_image) xv_create(NULL, SERVER_IMAGE,
- X XV_WIDTH, 64,
- X XV_HEIGHT, 64,
- X SERVER_IMAGE_BITS, icon_bits,
- X NULL);
- X icon_mask = (Server_image) xv_create(NULL, SERVER_IMAGE,
- X XV_WIDTH, 64,
- X XV_HEIGHT, 64,
- X SERVER_IMAGE_BITS, icon_mask_bits,
- X NULL);
- X ic = (Icon) xv_create(frame, ICON,
- X ICON_IMAGE, icon,
- X ICON_MASK_IMAGE, icon_mask,
- X NULL);
- X xv_set(frame,
- X FRAME_ICON, ic,
- X NULL);
- }
- X
- X
- //***************************************************************************
- // void GWList::row_deselect(int, Response *)
- //
- void GWList::row_deselect(int, Response *)
- {
- }
- X
- X
- //***************************************************************************
- // void GWList::row_select(int, Response *)
- //
- void GWList::row_select(int, Response *)
- {
- }
- X
- X
- //***************************************************************************
- // void GWList::show_item_info_proc(Menu, Menu_item mi)
- // Create a little popup which displays the information about the currently
- // selected item.
- //
- void GWList::show_item_info_proc(Menu, Menu_item mi)
- {
- X GWList *gwindow = (GWList *) xv_get(mi, XV_KEY_DATA, KEY_GWINDOW);
- X
- X GWInfo *list = new GWInfo(gwindow->frame);
- X if (gwindow->current_selected == -1)
- X {
- X //
- X // No row is selected. We will assume we want to display info
- X // about the window itself.
- X //
- X list->open(new Response(gwindow->info));
- X }
- X else
- X {
- X //
- X // Some row was selected. Display info about this item.
- X //
- X Response *r;
- X r = (Response *) xv_get(gwindow->dir_list, PANEL_LIST_CLIENT_DATA, gwindow->current_selected);
- X list->open(r);
- X }
- }
- SHAR_EOF
- chmod 0664 GWList.cc ||
- echo 'restore of GWList.cc failed'
- Wc_c="`wc -c < 'GWList.cc'`"
- test 8870 -eq "$Wc_c" ||
- echo 'GWList.cc: original size 8870, current size' "$Wc_c"
- fi
- # ============= GWPref.cc ==============
- if test -f 'GWPref.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWPref.cc (File already exists)'
- else
- echo 'x - extracting GWPref.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWPref.cc' &&
- //
- // GWPref.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWPref class
- //
- #include "xvgopher.h"
- #include "GWPref.h"
- #include "Preferences.h"
- X
- GWPref *gwpref;
- X
- X
- //***************************************************************************
- // GWPref::GWpref(Frame par)
- //
- GWPref::GWPref(Frame par)
- {
- X parent = par;
- }
- X
- X
- //***************************************************************************
- // GWPref::~GWpref()
- //
- GWPref::~GWPref()
- {
- }
- X
- X
- //***************************************************************************
- // void GWPref::done_proc(Frame frame)
- // This gets called whenever a command frame is destroyed. In the case
- // of the preferences window, we only need to hide the window.
- //
- void GWPref::done_proc(Frame frame)
- {
- X xv_set(frame,
- X XV_SHOW, FALSE,
- X NULL);
- }
- X
- X
- //***************************************************************************
- // int GWPref::open(Response *)
- // Create the preferences window.
- //
- int GWPref::open(Response *)
- {
- X compute_location(600, 500);
- X frame = (Frame) xv_create(parent, FRAME_CMD,
- X XV_X, next_x,
- X XV_Y, next_y,
- X XV_WIDTH, 447,
- X XV_HEIGHT, 248,
- X FRAME_LABEL, "Preferences",
- X FRAME_CMD_PIN_STATE, FRAME_CMD_PIN_OUT,
- X FRAME_SHOW_RESIZE_CORNER, FALSE,
- X XV_SHOW, FALSE,
- X FRAME_SHOW_FOOTER, FALSE,
- X FRAME_DONE_PROC, (void (*)(Frame)) done_proc,
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X NULL);
- X panel = (Panel) xv_get(frame, FRAME_CMD_PANEL);
- X
- X int value = preferences.get_popup_bookmarks() * 2 |
- X preferences.get_remove_children();
- X
- X choices = (Panel_item) xv_create(panel, PANEL_CHECK_BOX,
- X XV_X, 16,
- X XV_Y, 8,
- X PANEL_LAYOUT, PANEL_VERTICAL,
- X PANEL_CHOICE_STRINGS, "Remove all child windows when parent is unpinned",
- X "Popup Bookmarks at startup",
- X NULL,
- X PANEL_VALUE, value,
- X NULL);
- X
- X play = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 16,
- X XV_Y, 76,
- X PANEL_VALUE_DISPLAY_LENGTH, 30,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_LABEL_STRING, "Sound play command:",
- X NULL);
- X image = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 14,
- X XV_Y, 101,
- X PANEL_VALUE_DISPLAY_LENGTH, 30,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_LABEL_STRING, "Image view command:",
- X NULL);
- X telnet = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 48,
- X XV_Y, 126,
- X PANEL_VALUE_DISPLAY_LENGTH, 30,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_LABEL_STRING, "Telnet command:",
- X NULL);
- X print = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 59,
- X XV_Y, 151,
- X PANEL_VALUE_DISPLAY_LENGTH, 30,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_LABEL_STRING, "Print command:",
- X NULL);
- X mail = (Panel_item) xv_create(panel, PANEL_TEXT,
- X XV_X, 62,
- X XV_Y, 176,
- X PANEL_VALUE_DISPLAY_LENGTH, 30,
- X PANEL_VALUE_STORED_LENGTH, 80,
- X PANEL_LABEL_STRING, "Mail command:",
- X NULL);
- X
- X xv_create(panel, PANEL_BUTTON,
- X XV_X, 197,
- X XV_Y, 208,
- X PANEL_LABEL_STRING, "Apply",
- X XV_KEY_DATA, KEY_GWINDOW, this,
- X PANEL_NOTIFY_PROC, apply,
- X NULL);
- X
- X return OK;
- }
- X
- X
- //***************************************************************************
- // void GWPref::show()
- //
- void GWPref::show()
- {
- X xv_set(mail,
- X PANEL_VALUE, preferences.get_mail_filter(),
- X NULL);
- X xv_set(print,
- X PANEL_VALUE, preferences.get_print_filter(),
- X NULL);
- X xv_set(telnet,
- X PANEL_VALUE, preferences.get_telnet_command(),
- X NULL);
- X xv_set(image,
- X PANEL_VALUE, preferences.get_image_filter(),
- X NULL);
- X xv_set(play,
- X PANEL_VALUE, preferences.get_play_filter(),
- X NULL);
- X xv_set(frame,
- X XV_SHOW, TRUE,
- X NULL);
- }
- X
- X
- //***************************************************************************
- // void GWPref::apply(Panel_item item, Event *)
- // Read the changes made to the preferences panel and put them in our
- // database.
- //
- void GWPref::apply(Panel_item item, Event *)
- {
- X GWPref *gw = (GWPref *) xv_get(item, XV_KEY_DATA, KEY_GWINDOW);
- X
- X int value = (int) xv_get(gw->choices, PANEL_VALUE);
- X preferences.set_remove_children(value & 1);
- X preferences.set_popup_bookmarks(value & 2);
- X
- X preferences.set_mail_filter((char *) xv_get(gw->mail, PANEL_VALUE));
- X preferences.set_print_filter((char *) xv_get(gw->print, PANEL_VALUE));
- X preferences.set_play_filter((char *) xv_get(gw->play, PANEL_VALUE));
- X preferences.set_image_filter((char *) xv_get(gw->image, PANEL_VALUE));
- X preferences.set_telnet_command((char *) xv_get(gw->telnet, PANEL_VALUE));
- X
- X //
- X // Finally, remove the window.
- X //
- X xv_set(gw->frame,
- X XV_SHOW, FALSE,
- X NULL);
- }
- X
- X
- SHAR_EOF
- chmod 0644 GWPref.cc ||
- echo 'restore of GWPref.cc failed'
- Wc_c="`wc -c < 'GWPref.cc'`"
- test 4701 -eq "$Wc_c" ||
- echo 'GWPref.cc: original size 4701, current size' "$Wc_c"
- fi
- # ============= GWSound.cc ==============
- if test -f 'GWSound.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWSound.cc (File already exists)'
- else
- echo 'x - extracting GWSound.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWSound.cc' &&
- //
- // GWSound.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWSound class
- //
- #include "GWSound.h"
- #include "xvgopher.h"
- X
- X
- //***************************************************************************
- // GWSound::GWSound(Frame par)
- //
- GWSound::GWSound(Frame par) : GWDownload(par, GWDownload::BINARY, "Play", preferences.get_play_filter())
- {
- }
- SHAR_EOF
- chmod 0644 GWSound.cc ||
- echo 'restore of GWSound.cc failed'
- Wc_c="`wc -c < 'GWSound.cc'`"
- test 469 -eq "$Wc_c" ||
- echo 'GWSound.cc: original size 469, current size' "$Wc_c"
- fi
- # ============= GWTelnet.cc ==============
- if test -f 'GWTelnet.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWTelnet.cc (File already exists)'
- else
- echo 'x - extracting GWTelnet.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWTelnet.cc' &&
- //
- // GWTelnet.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the GWTelnet class
- //
- #include "GWTelnet.h"
- #include "xvgopher.h"
- #include <fcntl.h>
- #include <unistd.h>
- X
- X
- //***************************************************************************
- // GWTelnet::GWTelnet(Frame par)
- //
- GWTelnet::GWTelnet(Frame par)
- {
- X parent = par;
- }
- X
- X
- //***************************************************************************
- // int GWTelnet::open(Response *resp)
- // PURPOSE:
- // This is called when a telnet record has been received. We need to start a
- // terminal emulator and start telnet in it (to the correct host...)
- //
- int GWTelnet::open(Response *resp)
- {
- X char command[2000];
- X char new_title[2000];
- X int port;
- X
- X info = resp;
- X if (info->get_port() == 0)
- X port = 23; // There seems to be a problem with Mark Boyns. He didn't want to fix this in the gopher files!
- X else
- X port = info->get_port();
- X if (*info->get_command())
- X sprintf(new_title, "%s (login as %s)", info->get_title(), info->get_command());
- X else
- X strcpy(new_title, info->get_title());
- X sprintf(command, preferences.get_telnet_command(),
- X new_title,
- X info->get_server(),
- X port,
- X info->get_type());
- X system(command);
- X return OK;
- }
- X
- X
- SHAR_EOF
- chmod 0644 GWTelnet.cc ||
- echo 'restore of GWTelnet.cc failed'
- Wc_c="`wc -c < 'GWTelnet.cc'`"
- test 1331 -eq "$Wc_c" ||
- echo 'GWTelnet.cc: original size 1331, current size' "$Wc_c"
- fi
- # ============= GWindow.cc ==============
- if test -f 'GWindow.cc' -a X"$1" != X"-c"; then
- echo 'x - skipping GWindow.cc (File already exists)'
- else
- echo 'x - extracting GWindow.cc (Text)'
- sed 's/^X//' << 'SHAR_EOF' > 'GWindow.cc' &&
- //
- // GWindow.cc
- //
- // (c) Copyright 1993, San Diego State University -- College of Sciences
- // (See the COPYRIGHT file for more Copyright information)
- //
- // Implementation of the Window class
- //
- #include "GWBinary.h"
- #include "GWDirectory.h"
- #include "GWBookmarks.h"
- #include "GWFile.h"
- #include "GWIndex.h"
- #include "GWSound.h"
- #include "GWImage.h"
- #include "GWTelnet.h"
- #include "Connection.h"
- #include <unistd.h>
- #include <xview/notice.h>
- #include "xvgopher.h"
- #include "icons.h"
- #include "cursor.h"
- X
- int GWindow::next_x = 0;
- int GWindow::next_y = 0;
- X
- X
- //***************************************************************************
- // char *good_strtok(char *str, char *term)
- // PURPOSE:
- // This is a replacement for the standard strtok() which has a MAJOR
- // problem when it comes to having multiple delimiters in a row.
- // This one will return after EVERY terminator that is found.
- //
- char *good_strtok(char *str, char *term)
- {
- X static char *string;
- X if (str)
- X {
- X string = str;
- X }
- X
- X if (string == NULL || *string == '\0')
- X return NULL;
- X
- X char *p = string;
- X while (*string && strchr(term, *string) == NULL)
- X string++;
- X if (*string)
- X *string++ = '\0';
- X return p;
- }
- X
- X
- //***************************************************************************
- // GWindow::GWindow()
- //
- GWindow::GWindow()
- {
- X gopher = NULL;
- X frame = parent = NULL;
- X panel = NULL;
- X info = NULL;
- }
- X
- X
- //***************************************************************************
- // GWindow::~GWindow()
- //
- GWindow::~GWindow()
- {
- X if (gopher)
- X delete gopher;
- X if (info)
- X delete info;
- X
- X //
- X // If this is the parent of all windows, also delete the bookmarks so that
- X // all changes get written to disk.
- X //
- X if (!parent)
- X delete bookmarks;
- X
- X xv_destroy_safe(frame);
- }
- X
- X
- //***************************************************************************
- // void GWindow::main_loop()
- // PURPOSE:
- // This is the main loop for the windowing program.
- // When we return from this, the program should terminate
- //
- void GWindow::main_loop()
- {
- X xv_main_loop(frame);
- }
- X
- X
- //***************************************************************************
- // void GWindow::display()
- // PURPOSE:
- // Display information from the gopher server in our window
- //
- void GWindow::display()
- {
- X frame_unbusy(frame);
- }
- X
- X
- //***************************************************************************
- // int GWindow::open(Response *resp)
- //
- int GWindow::open(Response *resp)
- {
- X resp = resp;
- X printf("ERROR!!! THIS SHOULD NEVER HAPPEN!\n");
- X exit(42);
- X return 0;
- }
- X
- X
- //***************************************************************************
- // void GWindow::quit_proc(Frame frame, Event *event)
- // PURPOS:
- // This gets called when the user presses 'q' in a window.
- //
- void GWindow::quit_proc(Frame frame, Event *event)
- {
- X event = event;
- X GWindow *win = (GWindow *) xv_get(frame, XV_KEY_DATA, KEY_GWINDOW);
- X delete win;
- X xv_destroy_safe(frame);
- }
- X
- X
- //***************************************************************************
- // void GWindow::done_proc(Frame frame)
- // PURPOSE:
- // This gets called whenever a command frame is destroyed. We need to
- // clean up the associated GWindow structure. Since we want all children
- // to go away as well, we will call this function recursively on our subframes.
- //
- void GWindow::done_proc(Frame frame)
- {
- X if (!frame)
- X return;
- X GWindow *win = (GWindow *) xv_get(frame, XV_KEY_DATA, KEY_GWINDOW);
- X Frame subframe = (Frame) xv_get(frame, FRAME_NTH_SUBFRAME, 1);
- X done_proc(subframe);
- X delete win;
- X xv_destroy_safe(frame);
- }
- X
- X
- //***************************************************************************
- // void GWindow::status(char *str)
- // PURPOSE:
- // Display an informative message in the footer of the window
- //
- void GWindow::status(char *str)
- {
- X xv_set(frame,
- X FRAME_LEFT_FOOTER, str,
- X NULL);
- }
- X
- X
- //***************************************************************************
- // void GWindow::compute_location(int width, int height)
- // PURPOSE:
- // Compute the location of the next window. The size of the next window is
- // given so that we can make sure that the whole window is displayed on the
- // screen.
- //
- void GWindow::compute_location(int width, int height)
- {
- X GWindow * gwindow = (GWindow *) xv_get(parent, XV_KEY_DATA, KEY_GWINDOW);
- X static int first_time = 2;
- X
- X if (!gwindow->parent && first_time)
- X {
- X //
- X // The current window is the second window of the program. This is because
- X // our parent doesn't have a parent.
- X //
- X next_x = (int) xv_get(parent, XV_X);
- X next_y = (int) xv_get(parent, XV_Y);
- X first_time--;
- X }
- X
- X //
- X // We now have next_x and next_y to work with as the location of the previous window.
- X // Now we need to increment them and possibly wrap them if the window will not fit
- X // on the screen.
- X //
- X next_x += 10;
- X next_y += 25;
- X
- X //
- X // Get the size of the screen. We will use the parent frame for this since
- X // we are not sure that our frame has been initialized, yet.
- X //
- X Display *dpy = (Display *) xv_get(parent, XV_DISPLAY);
- X int screen_width = DisplayWidth(dpy, DefaultScreen(dpy));
- X int screen_height = DisplayHeight(dpy, DefaultScreen(dpy));
- X if (next_x + width + 20 > screen_width)
- X next_x = 0;
- X if (next_y + height + 40 > screen_height)
- X next_y = 0;
- }
- X
- X
- //***************************************************************************
- // GWindow *CreateWindow(Response *resp, Frame par)
- // PURPOSE:
- // This function will create a new window which will display the
- // data specified in the arguments correctly.
- //
- GWindow *CreateWindow(Response *resp, Frame par)
- {
- X GWindow *gw;
- X
- X switch (resp->get_type())
- X {
- X case GOPHER_FILE:
- X gw = new GWFile(par);
- X break;
- X case GOPHER_DIRECTORY:
- X gw = new GWDirectory(par);
- X break;
- X case GOPHER_SPECIAL:
- X gw = new GWDirectory(par);
- X break;
- X case GOPHER_SOUND:
- X gw = new GWSound(par);
- X break;
- X case GOPHER_BIN:
- X gw = new GWBinary(par);
- X break;
- X case GOPHER_CSO:
- X case GOPHER_ERROR:
- X xv_create(par, NOTICE,
- X NOTICE_MESSAGE_STRINGS, "XvGopher currently doesn not support this",
- X NULL,
- X NOTICE_BUTTON_YES, "Bummer",
- X NOTICE_BLOCK_THREAD, TRUE,
- X NOTICE_LOCK_SCREEN, TRUE,
- X XV_SHOW, TRUE,
- X NULL);
- X return NULL;
- X break;
- X case GOPHER_BINHEX:
- X case GOPHER_DOS:
- X case GOPHER_UU:
- X gw = new GWBinary(par);
- X break;
- X case GOPHER_INDEX:
- X gw = new GWIndex(par);
- X break;
- X case GOPHER_TELNET:
- X gw = new GWTelnet(par);
- X break;
- X case GOPHER_IMAGE:
- X gw = new GWImage(par);
- X break;
- X case GOPHER_REDUNDANT:
- X default:
- X printf("Sorry, '%c' not implemented, yet!\n", resp->get_type());
- X return NULL;
- X }
- X if (gw->open(resp) == OK)
- X return gw;
- X else
- X {
- X delete gw;
- X return NULL;
- X }
- }
- X
- X
- //***************************************************************************
- // void GWindow::nothing_found()
- // PURPOSE:
- // This function will create a new window which will display the
- // data specified in the arguments correctly.
- //
- void GWindow::nothing_found()
- {
- X xv_create(parent, NOTICE,
- X NOTICE_BLOCK_THREAD, TRUE,
- X NOTICE_LOCK_SCREEN, TRUE,
- X NOTICE_MESSAGE_STRINGS, "Nothing was found!", NULL,
- X NOTICE_BUTTON_YES, "Bummer",
- X XV_SHOW, TRUE,
- X NULL);
- X delete this;
- }
- X
- X
- //***************************************************************************
- // void GWindow::list_full()
- // This will create a popup telling the user that the scrolling list is full.
- // I have imposed a limit because xview will hang when a scrolling list gets
- // more than a couple thousand entries in it.
- //
- void GWindow::list_full()
- {
- X xv_create(frame, NOTICE,
- X NOTICE_MESSAGE_STRINGS, "The scrolling list is full. Sorry",
- X NULL,
- X NOTICE_BUTTON_YES, "Oh well",
- X NOTICE_BLOCK_THREAD, TRUE,
- X NOTICE_LOCK_SCREEN, TRUE,
- X XV_SHOW, TRUE,
- X NULL);
- }
- X
- X
- SHAR_EOF
- chmod 0664 GWindow.cc ||
- echo 'restore of GWindow.cc failed'
- Wc_c="`wc -c < 'GWindow.cc'`"
- test 7751 -eq "$Wc_c" ||
- echo 'GWindow.cc: original size 7751, current size' "$Wc_c"
- fi
- true || echo 'restore of Gopher.cc failed'
- echo End of part 2, continue with part 3
- exit 0
-